function sleep (ms) {
  return new Promise(resolve => {
    setTimeout(resolve, ms)
  })
}


// 同步执行方式一：
// async function fun (arr) {
//   for (let i = 0; i < arr.length; i++) {
//     await arr[i]()
//   }
// }

// 同步执行方式二：使用forEach，但是还是异步执行，所以我们需要改造forEach
// function fun (arr) {
//   arr.forEach(async fun => {
//     await fun()
//   })
// }

// 手动实现 forEach
// thisArg 为执行回调时的 this 值
Array.prototype.my1ForEach = async function (callback, thisArg) {
  const _arr = this, _isArray = Array.isArray(_arr), _thisArg = thisArg ? Object(thisArg) : window
  if (!_isArray) {
    throw TypeError('调用者必须是数组')
  }
  for (let i = 0; i < _arr.length; i++) {
    await callback.call(_thisArg, _arr[i], i, _arr)
  }
}
function fun (arr) {
  arr.my1ForEach(async f => {
    await f()
  })
}
fun ([
  () => console.log('start'),
  () => sleep(1000),
  () => console.log('1'),
  () => sleep(2000),
  () => console.log('2'),
  () => sleep(3000),
  () => console.log('end')
])

